﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

#define OK 1

typedef int Status;//重命名
typedef int ElemType;

#define LIST_INIT_SIZE   100  //动态开辟的大小
#define LISTINCREMENT    10  //动态开辟增加的大小

//结构体的定义
typedef struct
{
	ElemType *elem;//线性表的基地址
	int length;//线性表的当前长度
	int listsize;//线性表当前存储空间的大小

}SqList;



//构建新的线性表
Status InitList(SqList *L)
{
	L->length = 0;
	L->listsize = LIST_INIT_SIZE;
	L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	//判断是否开辟成功
	if (L->elem == NULL)
	{
		perror("The reason for the error is ");
		
	}
	else
	{
		printf("一个空的线性表创建成功！\n");//运行🆗
		return OK;
	}
}


//对线性表赋值
Status ValueList(SqList *L)
{
	int i, j;
	printf("请输入线性表元素的个数:>");
	scanf("%d",&i);

	//判断i是否大于线性表存储空间的大小
   while (1)
		{
			if (i > L->listsize)
			{
				//增加空间
				L->elem = (ElemType*)realloc(L->elem, LISTINCREMENT*sizeof(ElemType));
				L->listsize += LISTINCREMENT;

				//判断是否成功
				if (L->elem == NULL)
				{
					perror("The reason for error is");
				}
			}
			else
			{
				break;
			}
		}

   //赋值操作
   for (j = 0; j < i; j++)
   {
	   printf("请输入第%d个位置的元素:>\n",j+1);
	   scanf("%d",&L->elem[j]);

   }
   L->length = i;
   printf("赋值成功！\n");
   return OK;

}



//顺序表查找,返回其序号
Status LocateList(int e,const SqList L)
{
	int k;
	for (k = 0; k < L.length; k++)
	{
		if (e == L.elem[k])
		{
			return k + 1;
		}
	}
	return 0;
}


//顺序表的插入
Status InsertList(int a, int b, SqList *L)
{
	int j;
	//判断插入的位置是否合法
	if (b < 1||b>L->listsize)
	{
		printf("插入位置不合法！\n");
	}

	else if (L->length == L->listsize)
	{
		printf("当前顺序表存储位置已满！\n");
	}
	else
	{
		L->length++;
		for (j = L->length - 1; j >= b - 1; j--)
		{
			L->elem[j + 1] = L->elem[j];
			L->elem[j] = a;
		}
		
		printf("插入成功！\n");
	}
	


	return OK;
}



//Show
void ShowList(SqList L)
{
	int i;
	printf("顺序表展示:>\n");
	for (i = 0; i < L.length; i++)
	{
		printf("%d \n",L.elem[i]);
	}
}


//删除
Status DeleteList(SqList *L)
{
	int e;
	int k;
	int i;
	printf("请输入你要删除的数:>");
	scanf("%d",&e);

	//查找
	for (k = 0; k < L->length; k++)
	{
		if (e == L->elem[k])
		{
			for (i = k; i <L->length-1 ; i++)
			{
				L->elem[i] = L->elem[ i+ 1];

			}
			L->length--;
			printf("删除成功！\n");
			return OK;
		}
		
	}
	printf("没有你要查找的数！\n");
}



int main()
{

	SqList L;
	//构建新的线性表
	InitList(&L);

	//对线性表进行赋值
	ValueList(&L);

	//顺序表的查找
	int e;
	int ret=0;
	printf("请输入你要查找的值:>");
	scanf("%d",&e);
	ret=LocateList(e,L);
	if (ret == 0)
	{
		printf("没有你要查找的数！\n");
	}
	else
	{
		printf("你要查找的数在第%d个位置！\n",ret);

	}
	

	//顺序表的插入
	int a,b;
	printf("请输入要插入的值:>");
	scanf("%d",&a);
	printf("请输入要插入的位序数:>");
	scanf("%d",&b);

	InsertList(a,b,&L);

	//Show
	ShowList(L);

	//顺序表的元素删除
	DeleteList(&L);
	ShowList(L);

	return 0;
}